/*
 * =====================================================================================
 *
 *       Filename:  main.c
 *
 *    Description:  main
 *
 *        Version:  1.0
 *        Created:  2013年11月14日 21时58分33秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  BeeSui Xue (BX), xuejilong@foxmail.com
 *        Website:  http://beesui.com
 *        License:  GNU General Public License
 *   Organization:  Free Person
 *
 * =====================================================================================
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

//打印出本程序的使用方法
void usage()
{
	//提示PC含有的cpu核心数
	printf("cpu has %d cores\n", get_cpu_num());
	printf("usage: (Need SUPER USER Permission !!!)\n");
	printf("cpu_tool <cmd> <params ...>\n");
	printf("   r <opt> <cpu_num>   read\n");
	printf("       c   current frequence\n");
	printf("       n   min frequence\n");
	printf("       x   max frequence\n");
	printf("       f   available frequence\n");
	printf("       g   available governors\n");
	printf("       o   current governor\n");
	printf("       s   setspeed\n");
	printf("   w <opt> <param> <cpu_num>   write\n");
	printf("       g   <governors>\n");
	printf("       s   <setspeed>\n");
	printf("   c <opt> <interval> <count> <file> colect\n");
	printf("       u   colect cpu usage\n");
	printf("       r   colect memory usage\n");
	printf("       n   colect network usage\n");
	printf("       d   colect disk usage\n");
	printf("   g <opt> <input file> <output file> generate files\n");
	printf("       j   General JPG file\n");
	printf("       p   General PDF file\n");
	printf("       n   General PNG file\n");
	printf("       c   General CSV file\n");
}

int main(int argc, char * argv[])
{
	//如果运行参数小与4或大于7,则参数必然错误
	//打印出使用方法
	if(argc < 4 || argc > 7){
		usage();
		return 0;
	}
	char result[1024];
	int cpu_num = 0;

	int step;
	int total_steps;
	char * filename;

	char *input_file;
	char *output_file;
	//根据参数1的第一个字符选择命令
	switch(argv[1][0])
	{
	case 'r':
		//读取命令
		//如果参数不等于4,则此次读取的参数必然是错误的
		//打印使用方法
		if(argc != 4){
			usage();
			return 0;
		}
		//将参数3有文本转换为int数字
		cpu_num = atoi(argv[3]);
		//根据参数的参数2的字符0判断需要读取的信息
		switch(argv[2][0])
		{
		case 'c':
			//读取cpu当前频率
			printf("CPU%d Current Frequence : %d\n", cpu_num, get_scaling_cur_freq(cpu_num));
			break;
		case 'n':
			//读取cpu的最小频率
			printf("CPU%d Min Frequence : %d\n", cpu_num, get_scaling_min_freq(cpu_num));
			break;
		case 'x':
			//读取cpu的最大频率
			printf("CPU%d Max Frequence : %d\n", cpu_num, get_scaling_max_freq(cpu_num));
			break;
		case 'f':
			//读取cpu可运行的频率
			get_scaling_available_frequences(result, cpu_num);
			printf("CPU%d Available Frequences :\n%s", cpu_num, result);
			break;
		case 'g':
			//读取cpu的调度方法
			get_scaling_available_governors(result, cpu_num);
			printf("CPU%d Available Governors :\n%s", cpu_num, result);
			break;
		case 'o':
			//读取cpu当前的调度方法
			get_scaling_governor(result, cpu_num);
			printf("CPU%d Current Governors :%s", cpu_num, result);
			break;
		case 's':
			//读取用户设置的频率
			printf("CPU%d Seted Frequence : %d\n", cpu_num, get_scaling_setspeed(cpu_num));
			break;
		default:
			//如果参数不是上面的任意一个，那么参数错误
			//打印使用方法
			printf("wrong command format !\n");
			usage();
			return -1;
		}
		break;
	case 'w':
		//设置cpu信息
		//如果参数不等于5,那么参数错误
		//打印使用方法
		if(argc != 5){
			usage();
			return 0;
		}
		//获取需要配置的cpu号
		cpu_num = atoi(argv[4]);
		//根据参数2的字符0判断需要设置的信息
		switch(argv[2][0])
		{
		case 'g':
			//设置cpu的调度方法
			set_cpu_governor(argv[3], cpu_num);
			break;
		case 's':
			//设置cpu的频率
			set_scaling_setspeed(atoi(argv[3]), cpu_num);
			break;
		default:
			//如果参数不是上面的任意一个，那么参数错误
			//打印使用方法
			printf("wrong command format !\n");
			usage();
			return -1;
		}
		break;
	case 'c':
		//搜集相关信息
		//如果参数不等于6,那么参数错误
		//打印使用方法
		if(argc != 6){
			usage();
			return 0;
		}
		step = atoi(argv[3]);
		total_steps = atoi(argv[4]);
		//参数5为获取数据后的文件名
		filename = argv[5];
		switch(argv[2][0])
		{
		case 'u':
			//获取cpu的使用情况
			get_cpu_usage(step, total_steps, filename);
			break;
		case 'n':
			//获取网络的使用情况
			get_network_usage(step, total_steps, filename);
			break;
		case 'r':
			//获取内存的使用情况
			get_memory_usage(step, total_steps, filename);
			break;
		case 'd':
			//获取磁盘的使用情况
			get_disk_usage(step, total_steps, filename);
			break;
		default:
			//如果参数不是上面的任意一个，那么参数错误
			//打印使用方法
			printf("wrong command format !\n");
			usage();
			return -1;
		}
		break;
	case 'g':
		//根据搜集的数据生成图片
		//如果参数不等于5,那么参数错误
		//打印使用方法
		if(argc != 5){
			usage();
			return 0;
		}
		//参数3是输入文件名
		input_file = argv[3];
		//参数4是输出文件名
		output_file = argv[4];
		switch(argv[2][0])
		{
		case 'j':
			//生成jpg图片
			gen_jpg_file(input_file, output_file);
			break;
		case 'p':
			//生成pdf文件
			gen_pdf_file(input_file, output_file);
			break;
		case 'n':
			//生成png文件
			gen_png_file(input_file, output_file);
			break;
		case 'c':
			//生成csv文件
			gen_csv_file(input_file, output_file);
			break;
		default:
			//如果参数不是上面的任意一个，那么参数错误
			//打印使用方法
			printf("wrong command format !\n");
			usage();
			return -1;
		}
		break;
	default:
		//如果参数不是上面的任意一个，那么参数错误
		//打印使用方法
		printf("wrong command format !\n");
		usage();
		return -1;
	}
	return 0;
}
